package com.play.parse;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Document.OutputSettings;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import edu.uci.ics.crawler4j.parser.ExtractedUrlAnchorPair;

/**
 * handler 只是个名称，替代原来使用tika的handler。<br/>
 * Htmlhandler 基类使用的tagsoup，tagsoup 不能处理div的问题。<br/>
 * 我们将使用jsoup替代，jsoup提供了类似于jquery的选择器，让我们的生活变得更美。
 * @author kongxp
 * @since 2013-07-17 10:38
 * 
 */
public abstract class JsoupHandler {

	protected String filePath;
	
	protected static final Logger logger = Logger.getLogger(JsoupHandler.class.getName()); 

	public JsoupHandler() {
		filePath = getFilePath();
	}
	/**
	 * 页面编码
	 */
	private String contentCharset;
	private String bodyText;
	private String title;

	private String baseUrl;
	protected Set<ExtractedUrlAnchorPair> outgoingurls  = new HashSet<>();

	public void parse(InputStream inputStream) {

	}

	/**
	 * 
	 * @param contentData 网页内容
	 * @param contextURL URL 纯粹是为了输出使用
	 */
	public void parse(byte[] contentData, String contextURL)  {
		String content = new String(contentData);
		
		//乱码在打开
		/*contentCharset = getChartset(content).toLowerCase();
		if(!contentCharset.equals("utf-8")){
			try {
				content = new String(contentData,contentCharset);
			} catch (UnsupportedEncodingException e1) {
				//logger.error(e1.getMessage());
				//e1.printStackTrace();
			}
		}*/
		Document doc = Jsoup.parse(content,contextURL);
		Elements base = doc.select("BASE");
		if(base !=null){
			baseUrl = base.attr("href");
		}
		
		//直接爬取产品信息，不管3721 直接获得产品信息，如果有产品信息 那说明没有outgoingurl，否则一直往下爬
		//获取商品右侧名称
		productInfo(contextURL, doc);
		//logger.info(contextURL);
		
		//产品列表
		productList(doc);
		
		//获取种子
		productSeed(doc);
	}

	/**
	 * 获取种子，一般我们会将分类页面作为入口，通过这个方法获取所有类别的URL
	 * @param doc
	 */
	protected abstract void productSeed(Document doc);
	/**
	 * 产品列表  一般列表中 可以直接拿到价格<br>
	 * 另外我们将从列表中获取产品详细的url
	 * @param doc
	 */
	protected abstract void productList(Document doc) ;
		
	/**
	 * 获取商品的详细信息
	 * @param contextURL
	 * @param doc
	 */
	protected abstract void productInfo(String contextURL, Document doc);

	private String getChartset (String content){
		Document doc = Jsoup.parse(content);
		Element e = doc.getElementsByTag("meta").first();
		String charset = "";
		if (e != null) {
			String contenttemp = "";
			if (e.attr("content") != null && e.attr("content") != "") {
				contenttemp = e.attr("content");
				charset = contenttemp.substring(contenttemp.indexOf("=") + 1);

			} else if (e.attr("charset") != null && e.attr("charset") != "")
				charset = e.attr("charset");
			else
				charset = "GBK";
		}
		
		return charset;
	} 

	// 如果有baseurl 返回 没有返回null
	public String getBaseUrl() {
		if(StringUtils.isBlank(baseUrl)){
			return null;
		}
		return baseUrl;
	}

	public String getContentCharset() {
		return contentCharset;
	}

	public String getBodyText() {
		return bodyText;
	}

	public String getTitle() {
		return title;
	}

	public Set<ExtractedUrlAnchorPair> getOutgoingUrls() {
		return outgoingurls;
	}

	protected abstract String getFilePath();
	

}
